Глава
17
Управление
файлами и каталогами
При использовании
любой операционной системы (ОС) вы, так или иначе, пользуетесь реализуемой с
ее помощью возможностью организации хранения информации на вашем устройстве.
Способы хранения могут быть различными, но смысл при этом не меняется — всегда
существует файловая система.
В этой связи
любая файловая система предполагает управление находящимися в этой системе файлами
и каталогами. В ColdFusion существуют теги <CFFILE> и <CFDIRECTORY>,
позволяющие управлять файловой системой на сервере. Причем тег <CFFILE>
предназначен для выполнения определенных действий над файлами, а тег <CFDIRECTORY>
в свою очередь можно использовать для управления каталогами. В этой главе будут
подробно описаны возможные действия, совершаемые с помощью указанных тегов.
Синтаксис
тега <CFFILE> зависит от того действия, определяемого по отношению к файлу
с помощью атрибута ACTION, который может принимать следующие значения:
Например,
для действия загрузки файла синтаксис тега выглядит так:
<CFFILE ACTION
= "Upload"
FILEFIELD =
"formfield"
DESTINATION
= "full_path_name"
NAMECONFLICT
= "Error | Skip | Overwrite | MakeUnique"
ACCEPT = "mime_type/file_type"
MODE = "permission"
ATTRIBUTES =
"file_attributes">
Далее приведем
таблицу возможных атрибутов в зависимости от используемого действия без учета
уже описанного значения upload (табл. 17.1).
Таблица
17.1. Список возможных атрибутов для разных действий тега <CFFILE>
Действие |
Список возможных
атрибутов |
||
Move |
SOURCE, DESTINATION,
ATTRIBUTES |
||
Rename |
SOURCE, DESTINATION,
ATTRIBUTES |
||
Copy |
SOURCE, DESTINATION,
ATTRIBUTES |
||
Delete |
FILE |
||
Read |
FILE, VARIABLE |
||
ReadBinary |
FILE, VARIABLE |
||
Write |
FILE, OUTPUT,
MODE, ADDNEWLINE, ATTRIBUTES |
||
Append |
FILE, OUTPUT,
ATTRIBUTES |
||
В табл. 17.2
представлено описание атрибутов тега <CFFILE>.
Таблица
17.2. Описание атрибутов тега <CFFILE>
Атрибут |
Описание |
||
ACTION |
Действие, выполняемое
над файлом (см. выше). Обязательный атрибут |
||
FILEFIELD |
Поле формы,
передающее в качестве значения файл для загрузки. Обязательный атрибут
только для действия Upload, не требует использования символов #, чтобы
определить переменную |
||
DESTINATION |
Полный путь
к каталогу или полное имя файла загрузки, перемещения, переименования
или копирования. В сочетании с действием Rename следует указывать
полное имя файла. Обязательный атрибут |
||
Атрибут |
Описание |
||
NAMECONFLICT |
Характеризует
поведение при конфликтной ситуации, когда указанный файл уже существует.
Возможные значения:
|
||
ACCEPT |
Ограничение
на тип файла. В качестве ограничения может быть указано несколько
значений через запятую. Каждое значение состоит из двух составляющих
"тип MIME/тип файла". Необязательный атрибут |
||
MODE |
Определяет доступ
к файлу в ОС UNIX, Linux, Solans, HP-UX. В Windows игнорируется. Необязательный
атрибут |
||
ATTRIBUTES |
Определяет атрибуты
файла через запятую. Возможные значения:
|
||
SOURCE |
Полное имя файла,
используемого в качестве источника того или иного действия. Только
для действий Move, Rename и Сору. Обязательный атрибут |
||
FILE |
Полное имя файла.
Обязательный атрибут. Только для действий Delete, Read,
ReadBinary, Write И Append |
||
VARIABLE |
Название переменной,
которая будет принимать значение содержания файла. Обязательный атрибут.
Только для действий Read и ReadBinary |
||
ADDNEWLINE |
Добавление в
конец текста символа перехода на новую строку. Только для действия
Write. Возможные значения: • Yes — да (по
умолчанию); • No — нет. Необязательный атрибут |
||
OUTPUT |
Содержимое,
записываемое в указанный файл. Только для действий Write и Append.
Обязательный атрибут |
||
Следует отметить,
что при действии загрузки файла (upload) с использованием тега <CFFILE>
создается объект cffiie, обеспечивающий доступ к вспомогательной информации
с помощью следующих переменных:
Для понимания
описанного выше синтаксиса тега, предназначенного для работы с файлами, приведем
несколько примеров. Следующий пример позволяет нам записать определенный текст
в указанный файл:
<CFFILE ACTION
= "Write"
FILE = "C:\Apache\htdocs\my-app\city.htm"
OUTPUT = "<html><body><hl>NewYork</hl>">
Причем, если
указанный файл не существует, то ColdFusion создает его в соответствии с определяемым
месторасположением. Как видно из приведенного примера, в файле city.htm не были
закрыты основные теги. Чтобы исправить данную ошибку, представим другой пример,
позволяющий добавлять необходимый фрагмент текста:
<CFFILE ACTION
= "Append"
FILE = "C:\Apache\htdocs\my-app\city.htm"
OUTPUT = "</body></html>">
Еще один
пример, приведенный ниже, предполагает копирование существующего файла по указанному
пути с атрибутом "только для чтения":
<CFFILE ACTION
= "Copy"
SOURCE = "C:\Apache\htdocs\my-app\city.htm"
DESTINATION = "C:\InetPub\wwwroot\my-app\"
ATTRIBUTES =
"ReadOnly">
где в качестве
атрибута DESTINATION может быть указано полное имя файла. Для удаления файла
можно использовать следующий вариант:
<CFFILE ACTION
= "Delete"
FILE = "С:\Apache\htdocs\my-app\city.htm">
Представим
пример для загрузки файлов с предварительно открывающейся диалоговой формой,
позволяющей выбрать необходимый файл (листинг 17.1)
Листинг
17.1. Код страницы TestUpLoadFile.cfm
<HTML>
<HEAD>
<TITLE>Upload</TITLE>
</HEAD> <BODY>
<h3>Upload
File</h3>
<CFIF isDefined("Form.FiletoUpload")>
<CFFILE ACTION
= "Upload"
DESTINATION = "C:\InetPub\wwwroot\my-app\"
NAMECONFLICT = "Overwrite"
FILEFIELD = "Form.FiletoUpload">
<CFOUTPUT>
The information about upload a file<br>
Name: #cffile.serverFile#<br> Sourse:
#cffile.clientDirectory#<br>
Size: #file.fileSize#<br>
Last Modified:
#cffile.timeLastModified#<br>
</CFOUTPUT> <CFELSE>
<FORM action="TestUpLoadFile.cfm"
enctype="multipart/form-data"
method="post"> File for UpLoad:
<input type="file" name="FiletoUpload" size="30"><br>
<input type="submit" value="UpLoad"> </FORM> </CFIF>
</BODY>
</HTML>
Здесь с помощью
встроенных переменных при загрузке выбранного файла пользователю предоставляется
информация об этом файле, в частности, имя файла (cffile. serverFile), исходное
месторасположение загружаемого файла (cffile.clientDirectory), размер (cffiie.fiiesize)
и дата и время последней модификации (cffile.timeLastModified).
Как уже было
отмечено, тег <CFDIRECTORY> позволяет управлять каталогами на сервере.
Данный тег, так же, как и тег <CFFILE>, имеет атрибут ACTION, который
может принимать следующие значения:
<CFDIRECTORY ACTION = "List | Create | Delete | Rename"
DIRECTORY = "directory name" NAME = "query name"
FILTER = "list filter" MODE = "permission"
SORT = "sort
specification" NEWDIRECTORY = "new directory name">
В табл. 17.3
представлено описание атрибутов тега <CFDIRECTORY>.
Таблица
17.3. Описание атрибутов тега <CFDIRECTORY>
Атрибут |
Описание |
||
ACTION DIRECTORY NAME FILTER MODE |
Действие, подробно
описанное выше. Обязательный атрибут Имя каталога,
по отношению к которому предполагается совершение определенного действия.
Обязательный атрибут Имя запроса
(query), для которого выбираются данные в виде списка параметров.
Обязательный атрибут для действия List. Для других действий игнорируется Фильтр, позволяющий
ограничивать полученный список. Необязательный атрибут. Следует использовать
только с действием List. Можно применять специальные символы подстановки
* и ? Определяет доступ
к файлу в ОС UNIX, Linux, Solaris, HP-UX. В Windows игнорируется.
Необязательный атрибут |
||
Здесь с помощью встроенных переменных при загрузке выбранного файла пользователю предоставляется информация об этом файле, в частности, имя файла (cffile.serverFile), исходное месторасположение загружаемого файла (cffile.clientDirectory), размер (cffile.fiiesize) и дата и время последней модификации (cffile.timeLastModified).
Атрибут |
Описание |
||
SORT NEWDIRECTORY |
Значение сортировки
списка. Необязательный атрибут. Следует использовать только с действием
List. Можно указывать значение ASC (по возрастанию) и DESC (по убыванию),
предопределяя вид сортировки. Параметры сортировки необходимо использовать
через запятую. Например: datelastmodif
led DESC, name ASC, size DESC Имя нового каталога.
Обязательный атрибут для действия Rename. Для других действий игнорируется |
||
Отметим,
что при действии получения списка (List) тега <CFDIRECTORY> создается
объект запроса, обеспечивающий доступ к вспомогательной информации с помощью
следующих переменных:
И опять же
несколько примеров. Для создания нового каталога достаточно выполнить код:
<CFDIRECTORY
ACTION = "Create"
DIRECTORY =
"С:\Apache\htdocs\my-app\gif">
Переименовать
только что созданный каталог можно следующим образом:
<CFDIRECTORY
ACTION = "Rename"
DIRECTORY =
"C:\Apache\htdocs\my-app\gif" NEWDIRECTORY = "С:\Apache\htdocs\my-app\jpg">
Соответственно,
для удаления каталога можно воспользоваться конструкцией:
<CFDIRECTORY
ACTION = "Delete"
DIRECTORY =
"С:\Apache\htdocs\my-app\jpg">
И в завершение
представим пример, позволяющий выводить список каталогов и файлов в соответствии
с установленным текущим каталогом:
<CFDIRECTORY
ACTION = "List"
DIRECTORY =
"C:\Apache\htdocs\my-app\"
NAME = "QueryDir"
FILTER = "of*.*"
SORT = "datelastmodified
DESC, name ASC, size DESC">
<TABLE cellpadding="0"
cellspacing="0"> <TR>
<TD><b>Name</b></TD>
<TD><b>Size</b></TD>
<TD><b>DateLastModified</b></TD>
</TR>
<CFOUTPUT
QUERY="QueryDir"> <TR>
<TD>#Namet</TDV
<TD>#Size#</TD>
<TD>#DateLastModified#</TD>
</TR>
</CFOUTPUT>
</TABLE>
Здесь для
вывода результатов списка каталогов и файлов был использован тег <CFOUTPUT>
с атрибутом QUERY. В этом же примере были указаны атрибуты FILTER и SORT, позволяющие
ограничивать и сортировать полученный список.
В качестве
закрепления материала предлагаем читателю разработать собственную службу управления
файловой системой, где бы можно было с легкостью обрабатывать файлы и каталоги,
находящиеся на вашем компьютере, используя при этом возможности ColdFusion.
Подведем
итог. В данной главе мы использовали CFML-теги <CFFILE> и <CFDIRECTORY>.